import axios from 'axios';
import router from '@/router'

// 判断是否为生产环境
const isProduction = process.env.NODE_ENV === 'production'
// 全局变量 - 用于控制刷新状态
let isRefreshing = false

// 刷新 token 的函数
const refreshToken = () => {
  const refreshToken = localStorage.getItem("refresh_token");
  
  if (!refreshToken) {
    return router.push('/login');
  }

  return new Promise((resolve, reject) => {
    axios.post('/auth/oauth/token', {
      refresh_token: refreshToken
    }, {
      baseURL: process.env.VUE_APP_BASE_AUTH_API,
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    })
    .then(res => {
        if (res.hasOwnProperty('access_token')) {
                // 保存 access_token
            localStorage.setItem('access_token', res.access_token);
            localStorage.setItem('refresh_token',res.refresh_token);
        }
        resolve(res);
    })
    .catch(error => {
      localStorage.removeItem('access_token');
      localStorage.removeItem('refresh_token');
      reject(error)
    })
  })
}

// 创建一个 axios 实例
const service = axios.create({
    baseURL: isProduction ? process.env.VUE_APP_BASE_API : '/api', // 所有的请求地址前缀部分
    timeout: 60000, // 请求超时时间毫秒
    withCredentials: true, // 异步请求携带cookie
    headers: {
       
    },
})
// 添加请求拦截器
service.interceptors.request.use(
    function (config) {
        const token=localStorage.getItem('access_token');
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }
        // 在发送请求之前做些什么
        return config
    },
    function (error) {
        // 对请求错误做些什么
        console.log(error)
        return Promise.reject(error)
    }
)
// 添加响应拦截器
service.interceptors.response.use(
    function (response) {
        // 2xx 范围内的状态码都会触发该函数。
        // 对响应数据做点什么
        // dataAxios 是 axios 返回数据中的 data
        const dataAxios = response.data
        // 这个状态码是和后端约定的
        const code = dataAxios.reset
        return dataAxios
    },
    function (error) {
        const originalRequest = error.config
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        console.log(error)
        if(error.status==401){
            if (!isRefreshing) {
                isRefreshing=true;
                //刷新token
                refreshToken().then((res)=>{
                    console.log(JSON.stringify('axios::'+JSON.stringify(res)))
                    const newToken=localStorage.getItem('access_token');
                     // 更新 Authorization header
                    originalRequest.headers.Authorization = `Bearer ${newToken}`;
                    return service(originalRequest);
                }).catch(error=>{
                     router.push('/login');
                })
            }
        }
        return Promise.reject(error)
    }
)
export default service